﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace TTApp.Phone.Silverlight.Hexagons
{
    /// <summary>
    /// Thể hiện bảng tính điểm của 1 người chơi. Bảng tính điểm thường được đặt ở 2 cạnh của bàn cờ.
    /// </summary>
    public partial class OnePlayerScorePanel : UserControl
    {
        #region //--------- Private Fields --------------//
        private GameBase _game;
        private Player _player;
        #endregion

        #region //--------- Public Constructors ---------//
        /// <summary>
        /// Khởi tạo 1 đối tượng OnPlayerScorePanel.
        /// </summary>
        public OnePlayerScorePanel()
        {
            InitializeComponent();
        }
        #endregion

        #region //--------- CLR Properties --------------//
        /// <summary>
        /// Lấy hoặc gán đối tượng người người chơi liên kết với score panel này.
        /// </summary>
        public Player Player
        {
            get
            {
                return _player;
            }
            set
            {
                _player = value;
                _player.PropertyChanged += new PropertyChangedEventHandler(OnPlayerPropertyChanged);

                playerScoreTextBlock.Text = _player.Score.ToString();
                playerAvatarImage.Source = _player.HexagonImage.Source;
            }
        }

        /// <summary>
        /// Lấy hoặc gán đối tượng game mà bảng điểm này sử dụng để tính điểm.
        /// </summary>
        public GameBase Game
        {
            get
            {
                return _game;
            }
            set
            {
                _game = value;
                _game.TurnFinished += new EventHandler(OnGameTurnFinished);
                _game.GameStarted += new EventHandler(OnGameStarted);
                _game.GameEnded += new EventHandler(OnGameEnded);
            }
        }
        #endregion

        #region //--------- Event Handlers --------------//
        /// <summary>
        /// Bật story board nếu người người chơi đầu tiên sở hữu bảng điểm này.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnGameStarted(object sender, EventArgs args)
        {
            if (_game.CurrentPlayer == _player)
            {
                rotateStoryboard.Begin();
            }
            else
            {
                rotateStoryboard.Stop();
            }
        }

        /// <summary>
        /// Bật storyboard nếu đến lượt của người chơi đang sở hữu bảng điểm này.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnGameTurnFinished(object sender, EventArgs args)
        {
            if (_game.CurrentPlayer == _player)
            {
                rotateStoryboard.Begin();
            }
            else
            {
                rotateStoryboard.Stop();
            }
        }

        /// <summary>
        /// Game kết thúc thì ngừng quay hexagon.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnGameEnded(object sender, EventArgs args)
        {
            rotateStoryboard.Stop();
        }

        /// <summary>
        /// Chủ yếu bắt sự kiện chuyển điểm số.
        /// </summary>
        private void OnPlayerPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            if (args.PropertyName == "Score")
            {
                playerScoreTextBlock.Text = _player.Score.ToString();
            }
        }
        #endregion
    }
}
